/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.fatecz.filters;

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 *
 * @author ricardo.pupo
 */
public class MasterPage implements Filter {

    public class CharResponseWrapper extends HttpServletResponseWrapper {

        private CharArrayWriter output;

        @Override
        public String toString() {
            return output.toString();
        }

        public char[] toCharArray() {
            return (output.toCharArray());
        }

        public CharResponseWrapper(HttpServletResponse response) {
            super(response);
            output = new CharArrayWriter();
        }

        @Override
        public PrintWriter getWriter() {
            return new PrintWriter(output);
        }
    }

    public MasterPage() {
        
    }

    /**
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
        CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
        
        this.processLogin((HttpServletRequest)request, (HttpServletResponse)response);
        
        chain.doFilter(request, wrapper);
        
        if (response.getContentType() != null && response.getContentType().startsWith("text/html")) {
            if (!wrapper.toString().isEmpty()) {
                String responseString = wrapper.toString();

                String headCommomContent = getSHeadCommomContent((HttpServletRequest) request);
                responseString = insertAtEndOfHead(responseString, headCommomContent);

                String htmlMenu = getHtmlMenu((HttpServletRequest) request);
                responseString = insertAtStartOfBody(responseString, htmlMenu);

                String htmlHeader = getHtmlHeader((HttpServletRequest) request);
                responseString = insertAtStartOfBody(responseString, htmlHeader);             

                String htmlFooter = getHtmlFooter((HttpServletRequest) request);
                responseString = insertAtEndOfBody(responseString, htmlFooter);

                PrintWriter out = response.getWriter();

                out.write(responseString);
            }
        }
    }

    /**
     * Destroy method for this filter
     */
    @Override
    public void destroy() {

    }

    /**
     * Init method for this filter
     */
    @Override
    public void init(FilterConfig filterConfig) {
        
    }

    /**
     * Return a String representation of this object.
     */
    @Override
    public String toString() {
        return ("MasterPage()");
    }

    private void processLogin(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        if(request.getParameter("email") != null && request.getParameter("senha") != null){
            request.getSession(true).setAttribute("email", request.getParameter("email"));
            //TODO - Rotina de autenticação deusuário
            response.sendRedirect(request.getContextPath() + request.getServletPath());
        }else if(request.getParameter("logoff") != null){
            request.getSession(true).removeAttribute("email");
            response.sendRedirect(request.getContextPath());
        }
    }

    private String getSHeadCommomContent(HttpServletRequest request) throws IOException, ServletException {
        StringBuilder out = new StringBuilder();
        String diretorio = request.getContextPath();
        String email = (String) request.getSession(true).getAttribute("email");
        out.append("<link href='").append(request.getContextPath()).append("/_recursos/estilos/stylesheet-geral.css' rel='stylesheet' type='text/css' />");
        return out.toString();
    }

    private String getHtmlHeader(HttpServletRequest request) throws IOException, ServletException {
        StringBuilder out = new StringBuilder();
        String diretorio = request.getContextPath();
        String email = (String) request.getSession(true).getAttribute("email");
        out.append("<div id='main'>");
        out.append("    <div id='cabecalho'>");
        out.append("        <div id='cabecalhoLogo'> <a href='#'><img src='").append(request.getContextPath()).append("/_recursos/imagens/logo.png'/></a></div>");
        out.append("            <div id='cabecalhoLogin'>");
        if(email == null){
            out.append("               <div id='cabecalhoLoginLeft'>");
            out.append("                    <form action='' method='post' name='formLogin'>");
            out.append("                        Email:&nbsp;&nbsp;<input name='email' type='text' size='10' />&nbsp;");
            out.append("                        Senha:&nbsp;&nbsp;<input name='senha' type='text' size='10' />");
            out.append("                        <input name='btnEntrar' type='submit' value='Entrar' />");
            out.append("                    </form>");
            out.append("                </div>");
            out.append("                <div id='cabecalhoLoginRight'>&nbsp;</div>");
        }else{
            out.append("                <div id='cabecalhoLoginLeft'>");
            out.append("                    [ foto ]");
            out.append("                    <a href='").append(diretorio).append("/perfil.jsp'>").append(email).append("</a>");
            out.append("                </div>");
            out.append("                <div id='cabecalhoLoginRight'><a href='?logoff'>Sair</a></div>");
        }
        out.append("            </div>");
        out.append("        </div>");
        out.append("        <div id='menuPrincipal'>");
        out.append("            <div id='menuPrincipalLeft'>&nbsp;</div>");
        out.append("            <div id='menuPrincipalRight'>&nbsp;</div>");
        out.append("            <ul>");
        out.append("                <li><a href='").append(diretorio).append("/index.jsp'>Home</a></li>");
        out.append("                <li><a href='").append(diretorio).append("/unidades.jsp'>Unidades</a></li>");  // /unidades/index.jsp
        out.append("                <li><a href='").append(diretorio).append("/cursos.jsp'>Cursos</a></li>");  // /cursos/index.jsp
        out.append("                <li><a href='").append(diretorio).append("/grupos.jsp'>Grupos</a></li>");  // /cursos/index.jsp
        out.append("            </ul>");
        out.append("        </div>");
        out.append("        <div id='corpoPagina'>"); //abre a div corpo pagina que vai conter o menusecundario, o conteudo e a coluna extra de notificações/propagandas

        return out.toString();
    }

    private String getHtmlMenu(HttpServletRequest request) {
        StringBuilder out = new StringBuilder();
//
//        String diretorio = request.getContextPath();
//        String path = request.getRequestURI(); //PATH: VARIAVEL DO CAMINHO DA PAGINA.
//        String urlReal = request.getServletContext().getRealPath(request.getServletPath());
//
//        if (request.getAttribute("curso") != null) { //condição para o curso
//            out.append("    <div id='menuSecundario'>");
//            out.append("            <div id='menuSecundarioFoto'></div>");
//            out.append("        <ul class='menuVisualizacao'>");
////            out.append("            <li><a href='#'><span class='iconMenuEdicaoFoto'></span>Trocar foto</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/index.jsp'><span class='iconMenuVisualizacaoPerfil'></span>Perfil</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/atividades.jsp'><span class='iconMenuEdicaoNoticias'></span>Mural</a> </li> ");
//            out.append("        </ul>");
//            out.append("        <div id='linhaDivisoria'></div>");
//            out.append("        <ul class='menuConexoes'>");
//            out.append("            <li><a href='#'>Unidade</a></li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Unidade ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Disciplinas [ (11) ]</a> </li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Disciplina ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Grupos de Estudo [ (15) ]</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>  ");
//            out.append("        </ul>");
//            out.append("  </div>");
//        } else if (request.getAttribute("disciplina") != null) { //condicao para a disciplina
//            out.append("    <div id='menuSecundario'>");
//            out.append("            <div id='menuSecundarioFoto'></div>");
//            out.append("        <ul class='menuVisualizacao'>");
////            out.append("            <li><a href='#'><span class='iconMenuEdicaoFoto'></span>Trocar foto</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/index.jsp'><span class='iconMenuVisualizacaoPerfil'></span>Perfil</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/atividades.jsp'><span class='iconMenuEdicaoNoticias'></span>Mural</a> </li> ");
//            out.append("        </ul>");
//            out.append("        <div id='linhaDivisoria'></div>");
//            out.append("        <ul class='menuConexoes'>");
//            out.append("            <li><a href='#'>Unidade</a></li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Unidade ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Curso</a> </li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Curso ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Turno</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'>[ Nome do Turno ]</a>");
//            out.append("            </div>");
//            out.append("        </ul>");
//            out.append("  </div>");
//        } else if (request.getAttribute("unidade") != null) { //condicao para a unidade
//            out.append("    <div id='menuSecundario'>");
//            out.append("            <div id='menuSecundarioFoto'></div>");
//            out.append("        <ul class='menuVisualizacao'>");
////            out.append("            <li><a href='#'><span class='iconMenuEdicaoFoto'></span>Trocar foto</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/index.jsp'><span class='iconMenuVisualizacaoPerfil'></span>Perfil</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/atividades.jsp'><span class='iconMenuEdicaoNoticias'></span>Mural</a> </li> ");
//            out.append("        </ul>");
//            out.append("        <div id='linhaDivisoria'></div>");
//            out.append("        <ul class='menuConexoes'>");
//            out.append("            <li><a href='#'>Cursos [ (02) ]</a></li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Curso ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Curso ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Grupos de Estudo [ (15) ]</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>  ");
//            out.append("        </ul>");
//            out.append("  </div>");
//        } else if (request.getAttribute("turno") != null) { //condicao para o turno
//            out.append("    <div id='menuSecundario'>");
//            out.append("            <div id='menuSecundarioFoto'></div>");
//            out.append("        <ul class='menuVisualizacao'>");
////            out.append("            <li><a href='#'><span class='iconMenuEdicaoFoto'></span>Trocar foto</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/index.jsp'><span class='iconMenuVisualizacaoPerfil'></span>Perfil</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/atividades.jsp'><span class='iconMenuEdicaoNoticias'></span>Mural</a> </li> ");
//            out.append("        </ul>");
//            out.append("        <div id='linhaDivisoria'></div>");
//            out.append("        <ul class='menuConexoes'>");
//            out.append("            <li><a href='#'>Unidade</a></li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Unidade ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Curso</a> </li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Curso ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Grupos de Estudo [ (15) ]</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>  ");
//            out.append("            <li><a href='#'>Membros [ (40) ]</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>   ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>   ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Mmebro ]</a>");
//            out.append("            </div>");
//            out.append("        </ul>");
//            out.append("  </div>");
//        } else {
//            out.append("    <div id='menuSecundario'>");
//            out.append("            <div id='menuSecundarioFoto'></div>");
//            out.append("        <ul class='menuVisualizacao'>");
//            out.append("            <li><a href='#'><span class='iconMenuEdicaoFoto'></span>Trocar foto</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/index.jsp'><span class='iconMenuVisualizacaoPerfil'></span>Perfil</a> </li>");
//            out.append("            <li><a href='").append(diretorio).append("/atividades.jsp'><span class='iconMenuEdicaoNoticias'></span>Mural</a> </li> ");
//            out.append("            <li><a href='").append(diretorio).append("/perfil.jsp'><span class='iconMenuEdicaoConfiguracoes'></span>Configurações</a> </li>");
//            out.append("        </ul>");
//            out.append("        <div id='linhaDivisoria'></div>");
//            out.append("        <ul class='menuConexoes'>");
//            out.append("            <li><a href='#'>Unidade</a></li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Unidade ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Curso </a> </li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Disciplina ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Disciplinas [ (11) ]</a> </li>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome da Disciplina ]</a>");
//            out.append("            </div>");
//            out.append("            <li><a href='#'>Grupos de Estudo [ (15) ]</a> </li> ");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>");
//            out.append("            <div class='menuConexoesItem'>");
//            out.append("                    <a href='#'> <div class='menuConexoesFoto'></div> [ Nome do Grupo de Estudo ]</a>");
//            out.append("            </div>  ");
//            out.append("        </ul>");
//            out.append("  </div>");
//        }

        return out.toString();
    }

    private String getHtmlFooter(HttpServletRequest request) throws IOException, ServletException {
        StringBuilder out = new StringBuilder();
        String diretorio = request.getContextPath();
        String path = request.getRequestURI(); //PATH: VARIAVEL DO CAMINHO DA PAGINA.
        String urlReal = request.getServletContext().getRealPath(request.getServletPath());

        out.append("  </div>"); //essa div fecha a div CORPO PAGINA, aberta la no cabeçalho!
        out.append("     <div class='rodape'>"); //abre a div de classe rodape (eh necessaria para que possam ser inseridas as imagens de canto arredondado)
        out.append("          <div id='rodape'>"); //abre a div de id rodape, com os posicionamentos.
        out.append("             <div id='rodape-left'>Fatecz © 2011 </div>"); //canto arredondado direito
        out.append("             <div id='rodape-right'><a href='#'>Sobre</a> · <a href='#'>Anúncios</a> · <a href='#'>Desenvolvedores</a> · <a href='#'>Ajuda</a></div>"); //canto arredondado esquerdo
        out.append("          </div>"); //fecha a div id rodape
        out.append("     </div>"); //fecha a div classe rodape
        out.append("</div>"); //fecha a div MAIN aberta do cabeçalho!
        return out.toString();
    }

    public static String insertAtStartOfBody(String mainString, String content) {
        String result = "";
        int index = mainString.toUpperCase().indexOf("<BODY");
        if (index != -1) {
            index += "<BODY".length();
            while (mainString.charAt(index) != '>') {
                index++;
            }
            result = mainString.substring(0, index + 1);
            result += content;
            result += mainString.substring(index + 1, mainString.length());
        } else {
            result = mainString;
        }
        return result;
    }

    public static String insertAtEndOfBody(String mainString, String finish) {
        String result = "";

        int index = mainString.toUpperCase().lastIndexOf("</BODY>");
        if (index != -1) {
            result = mainString.substring(0, index);
            result += finish;
            result += mainString.substring(index, mainString.length());
        } else {
            result = mainString;
        }
        return result;
    }

    public static String insertAtEndOfHead(String mainString, String finish) {
        String result = "";

        int index = mainString.toUpperCase().lastIndexOf("</HEAD>");
        if (index != -1) {
            result = mainString.substring(0, index);
            result += finish;
            result += mainString.substring(index, mainString.length());
        } else {
            result = mainString;
        }
        return result;
    }
}
